import { Server } from "socket.io";
import axios from "axios";
import { createServer } from "http";

// 基础URL
axios.defaults.baseURL = "http://localhost:3000";
// 响应拦截器
axios.interceptors.response.use((res) => {
  return res.data;
});

// 创建一个通信服务器
const httpServer = createServer();
const io = new Server(httpServer, {
  cors: {
    origin: "*", // 允许跨域的前端域名
    methods: ["GET", "POST"], // 允许的跨域请求方法
    credentials: true, // 允许cookies等认证信息一起跨域传递
  },
});

// 维护一个map，key表示房间号，value表示用户列表，value是一个数组，里面存有socketId,用户ID
const groupList = {};

// 监听连接
io.on("connection", (socket) => {
  // 监听连接事件
  socket.on("join", async ({ roomId, id, userName }) => {
    console.log(userName, "连接到房间");
    // 连接到指定的房间号
    socket.join(roomId);
    // 维护map信息
    if (groupList[roomId]) {
      groupList[roomId].push({
        id, // 用户ID
        userName, // 用户名
        roomId, // 房间号
        socketId: socket.id, // socketId
      });
    } else {
      groupList[roomId] = [{ id, userName, roomId, socketId: socket.id }];
    }
    // 获取群聊总用户
    let countRes = await axios.get(`/user/getUserCount`);
    // 向房间内的所有用户广播消息，更新用户数量
    io.to(roomId).emit("userCount", {
      all: countRes.data,
      online: io.engine.clientsCount,
      userName // 广播最新加入的用户
    });
  });

  // 监听发送消息事件
  socket.on("send", async (data) => {
    console.log(data, "接收到消息");

    // 发送消息
    let res = await axios.post(`/message/send`, data);
    // 更新消息
    io.to(data.roomId).emit("message", res.data);
  });

  // 监听用户离开事件
  socket.on("disconnect", async () => {
    // 遍历房间信息，找到是谁离开了，然后更新这个房间的在线人数
    for (let key in groupList) {
      let list = groupList[key];
      // 根据socketId找到用户
      let index = list.findIndex((item) => item.socketId === socket.id);
      if (index !== -1) {
        let userInfo = list[index];
        let countRes = await axios.get(`/user/getUserCount`);
        // 向房间内的所有用户广播消息，更新用户数量
        io.to(userInfo.roomId).emit("userCount", {
          all: countRes.data,
          online: io.engine.clientsCount,
        });
        // 删除用户
        list.splice(index, 1);
        break;
      }
    }
  });
});

httpServer.listen(3001, () => {
  console.log("sockit服务器已启动 ws://localhost:3001");
});
